﻿Imports System.Data.SqlClient
Imports System.IO
Imports Sendkey = System.Windows.Forms.SendKeys
'Imports System.Threading

Public Class FrmMateriaTipoAsunto

#Region "Variables"

    Private cGeneral As New clsGeneral
    Private cMateriaTipoAsunto As New clsMateriaTipoAsunto

    Dim dtMateriaTipoAsunto As New DataTable()
    Dim NuevaFila As DataRow

    Dim li_Respuesta As Int16

#End Region

#Region "Eventos"

    Private Sub FrmMateriaTipoAsunto_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        gs_Pantalla = Me.Name
        ' carga valores para Auditoría
        cMateriaTipoAsunto.Aplicacion = gs_Sistema_Nombre
        cMateriaTipoAsunto.Pantalla = gs_Pantalla
        cMateriaTipoAsunto.Usuario = gs_Usuario
        cMateriaTipoAsunto.Maquina = gs_Maquina

        GridMateriaTipoAsunto.SelectionMode = DataGridViewSelectionMode.CellSelect
        dtMateriaTipoAsunto.Clear()
        dtMateriaTipoAsunto = cMateriaTipoAsunto.ObtenerMateriaTipoAsunto("Numerico")
        If dtMateriaTipoAsunto.Rows.Count > 0 Then
            Despliega()
        End If
    End Sub

    Private Sub Buscar_Click(sender As Object, e As EventArgs) Handles Buscar.Click
        FrmConsulta.Tag = "MateriaTipoAsunto"
        FrmConsulta.dt = dtMateriaTipoAsunto
        FrmConsulta.ShowDialog()
        Application.DoEvents()

        If gi_Codigo_1 <> -1 Then ' posiciona el registro seleccionado, aunque NO queda "sombreado"
            Posicionar_Grid(gi_Codigo_1)
        End If
    End Sub

    Private Sub Imprimir_Click(sender As Object, e As EventArgs) Handles Imprimir.Click
        'Dim dt_RPT As New DataTable("Resultados")
        'Dim NuevaFila As DataRow
        'Dim CrReport As New CrystalDecisions.CrystalReports.Engine.ReportDocument

        If dtMateriaTipoAsunto.Rows.Count > 0 Then
            Try
                '    dt_RPT.Columns.Add("Codigo")
                '    dt_RPT.Columns.Add("Descripcion")
                '    dt_RPT.Columns.Add("Titulo_Reporte")
                '    For Fila As Integer = 0 To ds.Tables("Resultados").Rows.Count - 1
                '        NuevaFila = dt_RPT.NewRow()
                '        NuevaFila("Codigo") = ds.Tables("Resultados").Rows(Fila).Item("ID_Contexto")
                '        NuevaFila("Descripcion") = ds.Tables("Resultados").Rows(Fila).Item("Nom_Contexto")
                '        NuevaFila("Titulo_Reporte") = "Reporte de Contextos"
                '        dt_RPT.Rows.Add(NuevaFila)
                '    Next

                '    CrReport = New CrystalDecisions.CrystalReports.Engine.ReportDocument()

                '    CrReport.Load(gs_RutaReportes & "RptCatalogos.rpt")

                '    CrReport.SetDataSource(dt_RPT)
                '    Frm_RPT_Visor.CrystalReportViewer1.ReportSource = CrReport
                '    Frm_RPT_Visor.Show()

            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
        Else
            MessageBox.Show("No hay datos para imprimir")
        End If
    End Sub

    Private Sub Excel_Click(sender As Object, e As EventArgs) Handles Excel.Click
        If dtMateriaTipoAsunto.Rows.Count > 0 Then
            cGeneral.DataTable_a_Excel(dtMateriaTipoAsunto, BarraProgreso)
        Else
            MessageBox.Show("No hay datos para exportar")
        End If
    End Sub

    Private Sub InsertarToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles InsertarToolStripMenuItem.Click
        Dim Fila As Integer
        Fila = GridMateriaTipoAsunto.CurrentCell.RowIndex
        ' recicla cMateriaTipoAsunto.Codigo para determinar el Nivel donde se va a incluir el nuevo registro
        cMateriaTipoAsunto.Codigo = GridMateriaTipoAsunto.CurrentCell.ColumnIndex      ' 1 = Materia , 2 = Tipo , 3 = Asunto
        cMateriaTipoAsunto.Materia = GridMateriaTipoAsunto.Item(1, Fila).Value
        cMateriaTipoAsunto.Tipo = GridMateriaTipoAsunto.Item(2, Fila).Value
        cMateriaTipoAsunto.Asunto = GridMateriaTipoAsunto.Item(3, Fila).Value
        ' ajusta el nivel en el que se va a insertar el nuevo registro
        Select Case cMateriaTipoAsunto.Codigo
            Case 1
                cMateriaTipoAsunto.Materia = 0
                cMateriaTipoAsunto.Tipo = 0
                cMateriaTipoAsunto.Asunto = 0
            Case 2
                cMateriaTipoAsunto.Tipo = 0
                cMateriaTipoAsunto.Asunto = 0
            Case 3
                cMateriaTipoAsunto.Asunto = 0
        End Select
        ' procesa la Inserción del nuevo registro
        If cMateriaTipoAsunto.Codigo < 1 Or cMateriaTipoAsunto.Codigo > 3 Then
            MessageBox.Show("Error, debe elegir el nivel apropiado (Materia, Tipo, Asunto) para insertar la nueva Materia/Tipo/Asunto")
        ElseIf cMateriaTipoAsunto.Codigo > 1 And GridMateriaTipoAsunto.Item(GridMateriaTipoAsunto.CurrentCell.ColumnIndex - 1, Fila).Value = 0 Then
            MessageBox.Show("Error, NO puede insertar en esta columna si la anterior es cero")
        Else
            FrmMateriaTipoAsunto_Editar.Text = "Insertar"
            FrmMateriaTipoAsunto_Editar.ShowDialog()
            Application.DoEvents()
            cMateriaTipoAsunto.Nombre = gs_Hilera
            cMateriaTipoAsunto.Area_Corresponde = gi_Codigo_1
            cMateriaTipoAsunto.Meses_Plazo = gi_Codigo_2

            If cMateriaTipoAsunto.Nombre <> "" Then
                cMateriaTipoAsunto.Guardar("Insertar")
                If cMateriaTipoAsunto.EstadoGuardar = -1 Then   ' -1 = Error
                    ' cMateriaTipoAsunto.Guardar() despliega el mensaje de error
                Else
                    ' recarga el Grid con TODOS los datos
                    dtMateriaTipoAsunto.Clear()
                    dtMateriaTipoAsunto = cMateriaTipoAsunto.ObtenerMateriaTipoAsunto("Numerico")
                    Despliega()
                    ' posiciona en el nuevo registro
                    cMateriaTipoAsunto.Codigo = cMateriaTipoAsunto.EstadoGuardar
                    Posicionar_Grid(cMateriaTipoAsunto.Codigo)
                End If
            End If
        End If
    End Sub

    Private Sub ModificarToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles ModificarToolStripMenuItem.Click
        Dim Fila As Integer
        Fila = GridMateriaTipoAsunto.CurrentCell.RowIndex
        cMateriaTipoAsunto.Materia = GridMateriaTipoAsunto.Item(1, Fila).Value
        cMateriaTipoAsunto.Tipo = GridMateriaTipoAsunto.Item(2, Fila).Value
        cMateriaTipoAsunto.Asunto = GridMateriaTipoAsunto.Item(3, Fila).Value
        ' procesa la Modificación del registro
        cMateriaTipoAsunto.Nombre = GridMateriaTipoAsunto.Item(4, Fila).Value
        cMateriaTipoAsunto.Area_Corresponde = GridMateriaTipoAsunto.Item(5, Fila).Value
        cMateriaTipoAsunto.Meses_Plazo = GridMateriaTipoAsunto.Item(6, Fila).Value
        gs_Hilera = cMateriaTipoAsunto.Nombre
        gi_Codigo_1 = cMateriaTipoAsunto.Area_Corresponde
        gi_Codigo_2 = cMateriaTipoAsunto.Meses_Plazo
        FrmMateriaTipoAsunto_Editar.Text = "Modificar"
        FrmMateriaTipoAsunto_Editar.ShowDialog()
        Application.DoEvents()
        cMateriaTipoAsunto.Nombre = gs_Hilera
        cMateriaTipoAsunto.Area_Corresponde = gi_Codigo_1
        cMateriaTipoAsunto.Meses_Plazo = gi_Codigo_2

        If cMateriaTipoAsunto.Nombre <> "" Then
            cMateriaTipoAsunto.Guardar("Modificar")
            If cMateriaTipoAsunto.EstadoGuardar = -1 Then   ' -1 = Error
                ' cMateriaTipoAsunto.Guardar() despliega el mensaje de error
            Else
                ' recarga el Grid con TODOS los datos
                dtMateriaTipoAsunto.Clear()
                dtMateriaTipoAsunto = cMateriaTipoAsunto.ObtenerMateriaTipoAsunto("Numerico")
                Despliega()
                ' posiciona en el registro recién modificado
                cMateriaTipoAsunto.Codigo = cMateriaTipoAsunto.EstadoGuardar
                Posicionar_Grid(cMateriaTipoAsunto.Codigo)
            End If
        End If
    End Sub

    Private Sub EliminarToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles EliminarToolStripMenuItem.Click
        Dim Fila As Integer
        Fila = GridMateriaTipoAsunto.CurrentCell.RowIndex
        cMateriaTipoAsunto.Materia = GridMateriaTipoAsunto.Item(1, Fila).Value
        cMateriaTipoAsunto.Tipo = GridMateriaTipoAsunto.Item(2, Fila).Value
        cMateriaTipoAsunto.Asunto = GridMateriaTipoAsunto.Item(3, Fila).Value
        ' cMateriaTipoAsunto.Codigo requerido en verificación de cMateriaTipoAsunto.Borrar()
        cMateriaTipoAsunto.Codigo = (cMateriaTipoAsunto.Materia * 10000) + (cMateriaTipoAsunto.Tipo * 100) + cMateriaTipoAsunto.Asunto
        ' procesa la Eliminación del registro
        li_Respuesta = MessageBox.Show("¿Desea eliminar esta Materia/Tipo/Asunto?", "", MessageBoxButtons.YesNo)
        If li_Respuesta = vbYes Then
            ' la verificación si el elemento actual tiene elementos hijos se realiza en el procedimiento almacenado
            cMateriaTipoAsunto.Borrar()
            If cMateriaTipoAsunto.EstadoGuardar = -1 Then   ' -1 = Error
                ' cMateriaTipoAsunto.Borrar() despliega el mensaje de error
            Else
                ' recarga el Grid con TODOS los datos
                dtMateriaTipoAsunto.Clear()
                dtMateriaTipoAsunto = cMateriaTipoAsunto.ObtenerMateriaTipoAsunto("Numerico")
                Despliega()
                ' posiciona en el registro anterior al recién eliminado
                If Fila > 1 Then
                    cMateriaTipoAsunto.Materia = GridMateriaTipoAsunto.Item(1, Fila - 1).Value
                    cMateriaTipoAsunto.Tipo = GridMateriaTipoAsunto.Item(2, Fila - 1).Value
                    cMateriaTipoAsunto.Asunto = GridMateriaTipoAsunto.Item(3, Fila - 1).Value
                Else
                    cMateriaTipoAsunto.Materia = GridMateriaTipoAsunto.Item(1, 1).Value
                    cMateriaTipoAsunto.Tipo = GridMateriaTipoAsunto.Item(2, 1).Value
                    cMateriaTipoAsunto.Asunto = GridMateriaTipoAsunto.Item(3, 1).Value
                End If
                cMateriaTipoAsunto.Codigo = (cMateriaTipoAsunto.Materia * 10000) + (cMateriaTipoAsunto.Tipo * 100) + cMateriaTipoAsunto.Asunto
                Posicionar_Grid(cMateriaTipoAsunto.Codigo)
            End If
        End If
    End Sub

#End Region

#Region "Metodos"

    Sub Despliega()
        GridMateriaTipoAsunto.DataSource = Nothing
        GridMateriaTipoAsunto.DataSource = dtMateriaTipoAsunto
        GridMateriaTipoAsunto.Columns("MateriaTipoAsunto").Visible = False
        GridMateriaTipoAsunto.Columns("Materia").Width = 70
        GridMateriaTipoAsunto.Columns("Tipo").Width = 50
        GridMateriaTipoAsunto.Columns("Asunto").Width = 65
        GridMateriaTipoAsunto.AutoResizeColumn(4)
        GridMateriaTipoAsunto.Columns("Area_Corresponde").Width = 45
        GridMateriaTipoAsunto.Columns("Plazo_Meses").Width = 50
        ' evita que las columnas se puedan ordenar dando Click en el encabezado
        For i As Integer = 0 To GridMateriaTipoAsunto.Columns.Count - 1
            GridMateriaTipoAsunto.Columns(i).SortMode = DataGridViewColumnSortMode.NotSortable
        Next
        GridMateriaTipoAsunto.Refresh()
    End Sub

    Sub Posicionar_Grid(ByRef Codigo As Long)
        For Fila As Integer = 0 To GridMateriaTipoAsunto.Rows.Count - 1
            If GridMateriaTipoAsunto.Item(0, Fila).Value = Codigo Then
                'GridMateriaTipoAsunto.CurrentCell = GridMateriaTipoAsunto.Rows(Fila).Cells(4)
                GridMateriaTipoAsunto.CurrentCell = GridMateriaTipoAsunto(4, Fila)   ' equivalente a la línea anterior
                Exit For
            End If
        Next
    End Sub

#End Region

End Class